package gioco;

import elementi.Bomba;
import elementi.Energia;
import elementi.Scudo;
import elementi.dardi.Dardo;
import elementi.dardi.DardoGrande;
import elementi.dardi.DardoLento;
import elementi.dardi.DardoVeloce;
import elementi.giocatori.Giocatore;

import java.util.LinkedList;
import java.util.Stack;

public class GestoreElementi {
	private static Arena arena = Arena.getArena();
	private static GestoreElementi singleton = new GestoreElementi();
	private Stack<DardoLento> stackDardoLento;
	private Stack<DardoVeloce> stackDardoVeloce;
	private Stack<DardoGrande> stackDardoGrande;
	private LinkedList<Scudo> scudi;
	private LinkedList<Energia> energie;
	private Stack<Bomba> stackBomba;
		
	
	private GestoreElementi(){
		stackDardoGrande = new Stack<DardoGrande>();
		stackDardoLento = new Stack<DardoLento>();
		stackDardoVeloce = new Stack<DardoVeloce>();
		scudi = new LinkedList<Scudo>();
		energie = new LinkedList<Energia>();
		stackBomba = new Stack<Bomba>();
	}
	
	
	public void istanziaDardoLento(float x, float y,float seno,float coseno){
		x += (Giocatore.RAGGIO_GIOCATORE+7)*coseno;
		y += (Giocatore.RAGGIO_GIOCATORE+7)*seno;
		if(stackDardoLento.size() > 0){
			DardoLento temp = stackDardoLento.pop();
			temp.reset(x,y,seno,coseno);
			arena.aggiungiElementoMobile(temp);
		}else{
			Dardo temp = FactoryProxy.getFactoryElementi().creaDardoLento(x, y, seno, coseno);
			arena.aggiungiElementoMobile(temp);
		}
	}
	
	public void istanziaDardoVeloce(float x, float y,float seno,float coseno){
		x += (Giocatore.RAGGIO_GIOCATORE+7)*coseno;
		y += (Giocatore.RAGGIO_GIOCATORE+7)*seno;
		if(stackDardoVeloce.size() > 0){
			DardoVeloce temp = stackDardoVeloce.pop();
			temp.reset(x,y,seno,coseno);
			arena.aggiungiElementoMobile(temp);
		}else{
			Dardo temp = FactoryProxy.getFactoryElementi().creaDardoVeloce(x, y, seno, coseno);
			arena.aggiungiElementoMobile(temp);
		}
	}
	
	public void istanziaDardoGrande(float x, float y,float seno,float coseno){
		x += (Giocatore.RAGGIO_GIOCATORE+14)*coseno;
		y += (Giocatore.RAGGIO_GIOCATORE+14)*seno;
		if(stackDardoGrande.size() > 0){
			DardoGrande temp = stackDardoGrande.pop();
			temp.reset(x,y,seno,coseno);
			arena.aggiungiElementoMobile(temp);
		}else{
			DardoGrande temp = FactoryProxy.getFactoryElementi().creaDardoGrande(x, y, seno, coseno);
			arena.aggiungiElementoMobile(temp);
		}
	}
	
	public void istanziaScudo(float x, float y){
			arena.aggiungiElemento(FactoryProxy.getFactoryElementi().creaScudo(x, y));		
	}
	
	public void istanziaEnergia(float x, float y){
			arena.aggiungiElemento(FactoryProxy.getFactoryElementi().creaEnergia(x, y));		
	}
	
	public void istanziaBomba(float x, float y, float seno, float coseno){
		x += (Giocatore.RAGGIO_GIOCATORE+20)*coseno;
		y += (Giocatore.RAGGIO_GIOCATORE+20)*seno;
		if(stackBomba.size() > 0){
			Bomba temp = stackBomba.pop();
			temp.reset(x,y,seno,coseno);
			arena.aggiungiElementoMobile(temp);
			arena.aggiungiTemporizzato(temp);
		}else{
			Bomba temp = FactoryProxy.getFactoryElementi().creaBomba(x, y, seno, coseno);
			arena.aggiungiElementoMobile(temp);
			arena.aggiungiTemporizzato(temp);
		}
	}
	
	public void rimuoviDardoLento(DardoLento dardo){
		arena.rimuoviElementoMobile(dardo);
		stackDardoLento.add(dardo);
	}
	
	public void rimuoviDardoGrande(DardoGrande dardo){
		arena.rimuoviElementoMobile(dardo);
		stackDardoGrande.add(dardo);
	}
	
	public void rimuoviDardoVeloce(DardoVeloce dardo){
		arena.rimuoviElementoMobile(dardo);
		stackDardoVeloce.add(dardo);
	}
	
	public void rimuoviScudo(Scudo scudo){
		arena.rimuoviElemento(scudo);
		scudi.add(scudo);
	}
	
	public void rimuoviEnergia(Energia energia){
		arena.rimuoviElemento(energia);
		energie.add(energia);
	}
	
	public void rimuoviBomba(Bomba bomba){
		arena.rimuoviElementoMobile(bomba);
		arena.rimuoviTemporizzato(bomba);
		stackBomba.add(bomba);
	}
	
	public static GestoreElementi getGestoreElementi(){
		return singleton;
	}
}